home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Die Speccy' 97
/
Die Speccy' 97.iso
/
amiga_system
/
the_aminet
/
util
/
cli
/
mcomms_1_4.lha
/
Src
/
changefont.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-09-02
|
6KB
|
191 lines
/****************************************************************************/
/* changefont.c */
/* Change default system font. */
/* Copyright ⌐ 1994 Michael Letowski */
/****************************************************************************/
#define __USE_SYSBASE
#include <exec/types.h>
#include <exec/execbase.h>
#include <exec/memory.h>
#include <dos/rdargs.h>
#include <dos/dosextens.h>
#include <graphics/text.h>
#include <support/types.h>
#include <support/exec.h>
#include <support/dos.h>
#include <string.h>
#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/diskfont.h>
#include <proto/graphics.h>
#include "changefont.rev.h"
#define DOS_NAME "dos.library"
#define DOS_VERN 37L
#define GFX_NAME "graphics.library"
#define GFX_VERN 0L
#define DISKFONT_NAME "diskfont.library"
#define DISKFONT_VERN 36L
#define STD_NAME "topaz.font"
#define STD_STYLE FS_NORMAL
#define STD_FLAGS (FPF_ROMFONT | FPF_DESIGNED)
#define REPLACE_FLAGS (FPF_DISKFONT | FPF_DESIGNED)
#define FLAGS_MASK (FPF_REVPATH | FPF_TALLDOT | FPF_WIDEDOT | FPF_PROPORTIONAL | FPF_DESIGNED)
#define TEMPLATE "NAME/A,SIZE/N/M,QUIET/S"
STATIC CONST TEXT VersionString[]=
VERSION(PROG_NAME,PROG_VERSION,PROG_REVISION,PROG_DATE);
#define MSG_REPLACED " Replaced\n"
#define MSG_NOT_REPLACED " Not Replaced"
#define INFO_TEMPLATE "%s %d"
#define FONT_EXT ".font"
#define OPT_NAME 0
#define OPT_SIZE 1
#define OPT_QUIET 2
#define OPT_COUNT 3
#define NAME_SIZE 32 /* Size of name buffer */
#define BASE_SIZE 25 /* Max allowed length of font's name w/o extension */
#define EXT_SIZE 5 /* Size of font extension */
#define FONT_SIZE (BASE_SIZE+EXT_SIZE)
STATIC BOOL Match(struct TextFont *srcFont, struct TextFont *destFont);
STATIC VOID CopyAttrs(struct TextFont *srcFont, struct TextFont *destFont);
ULONG ChangeFont(VOID)
{
struct ExecBase *SysBase=*((struct ExecBase **)4);
struct DosLibrary *DOSBase;
struct GfxBase *GfxBase;
struct Library *DiskfontBase;
STATIC CONST LONG Default8=8,Default9=9;
STATIC CONST LONG * CONST DefaultSizes[]={&Default8,&Default9,NULL};
LONG Opts[OPT_COUNT];
ULONG RC=RETURN_FAIL,FontError;
struct TextAttr StdAttr,ReplaceAttr;
struct TextFont *StdFont,*ReplaceFont;
CHAR FontName[NAME_SIZE];
LONG **SizesPtr,*TempPtr;
struct RDArgs *Args;
BOOL ErrOccured=FALSE;
unless(DOSBase=(struct DosLibrary *)OpenLibrary(DOS_NAME,DOS_VERN))
{
SetResult2(ERROR_INVALID_RESIDENT_LIBRARY);
goto InvalidDOS;
}
unless(GfxBase=(struct GfxBase *)OpenLibrary(GFX_NAME,GFX_VERN))
{
CauseIoErr(ERROR_INVALID_RESIDENT_LIBRARY,NULL);
goto InvalidGfx;
}
unless(DiskfontBase=OpenLibrary(DISKFONT_NAME,DISKFONT_VERN))
{
CauseIoErr(ERROR_INVALID_RESIDENT_LIBRARY,NULL);
goto InvalidDiskfont;
}
clear(&Opts); /* Clear out args buffer */
unless(Args=ReadArgs(TEMPLATE,Opts,NULL))
{
PrintFault(IoErr(),NULL); /* Inform user */
goto NoArgs;
}
StdAttr.ta_Name=STD_NAME;
StdAttr.ta_Flags=STD_FLAGS;
ReplaceAttr.ta_Name=FontName;
ReplaceAttr.ta_Flags=REPLACE_FLAGS;
ReplaceAttr.ta_Style=StdAttr.ta_Style=STD_STYLE;
SizesPtr=Opts[OPT_SIZE] ? (LONG **)Opts[OPT_SIZE] : DefaultSizes;
while(TempPtr=*SizesPtr++)
{
FontError=ERROR_OBJECT_NOT_FOUND; /* Possible error: font not found */
ReplaceAttr.ta_YSize=StdAttr.ta_YSize=*TempPtr;
unless(StdFont=OpenDiskFont(&StdAttr))
goto NoStdFont;
clear(&FontName);
strncpy(FontName,(STRPTR)Opts[OPT_NAME],FONT_SIZE);
unless(ReplaceFont=OpenDiskFont(&ReplaceAttr))
{
if(strlen(FontName)>BASE_SIZE) /* Name too long */
goto NoReplaceFont;
strcat(FontName,FONT_EXT); /* Now try concatenating ".font" */
unless(ReplaceFont=OpenDiskFont(&ReplaceAttr))
goto NoReplaceFont;
}
FontError=ERROR_OBJECT_WRONG_TYPE; /* Possible error: wrong type of font */
if(Match(ReplaceFont,StdFont)) /* Fonts match themselves */
{
Forbid();
CopyAttrs(ReplaceFont,StdFont);
Permit();
unless(Opts[OPT_QUIET])
VPrintf(INFO_TEMPLATE MSG_REPLACED,&StdAttr);
continue;
}
CloseFont(ReplaceFont);
NoReplaceFont:
CloseFont(StdFont);
NoStdFont:
VPrintf(INFO_TEMPLATE,&StdAttr); /* Trick: fields in TextAttr */
/* Structure match template parameters */
CauseIoErr(FontError,MSG_NOT_REPLACED);
ErrOccured=TRUE;
}
RC=ErrOccured ? RETURN_ERROR : RETURN_OK;
FreeArgs(Args);
NoArgs:
CloseLibrary(DiskfontBase);
InvalidDiskfont:
CloseLibrary((struct Library *)GfxBase);
InvalidGfx:
CloseLibrary((struct Library *)DOSBase);
InvalidDOS:
return(RC);
}
STATIC BOOL Match(struct TextFont *srcFont, struct TextFont *destFont)
{
return((BOOL)(srcFont->tf_YSize==destFont->tf_YSize &&
srcFont->tf_Style==destFont->tf_Style &&
(srcFont->tf_Flags & FLAGS_MASK)==
(destFont->tf_Flags & FLAGS_MASK) &&
srcFont->tf_XSize==destFont->tf_XSize &&
srcFont->tf_Baseline==destFont->tf_Baseline));
}
STATIC VOID CopyAttrs(struct TextFont *srcFont, struct TextFont *destFont)
{
destFont->tf_BoldSmear=srcFont->tf_BoldSmear;
destFont->tf_Modulo=srcFont->tf_Modulo;
destFont->tf_LoChar=srcFont->tf_LoChar;
destFont->tf_HiChar=srcFont->tf_HiChar;
destFont->tf_CharData=srcFont->tf_CharData;
destFont->tf_CharLoc=srcFont->tf_CharLoc;
destFont->tf_CharSpace=srcFont->tf_CharSpace;
destFont->tf_CharKern=srcFont->tf_CharKern;
}